<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 封装队列
      // 继续上文的问题
      // 解决的方法 想到了delete arr[0]
      // 但是如果arr 是数组的话 会有emtry 空白项 , 不利于返回 不利于计算
      // 转成对象的方式 就方便了很多

      class Queue {
        // 配置私有属性
        #items = {}; // 记录参与计算的对象
        #count = 0; // 每次执行的时候 ++
        #lowCount = 0; // 记录队头的索引

        // 删除队头
        dequeue() {
          // 如果此时队列就是空的 return undefined
          if (this.isEmpty()) {
            return undefined;
          }
          let res = this.#items[this.#lowCount];
          delete this.#items[this.#lowCount];
          // 原来的队头被删除了 所以现在的队头需要+1
          this.#lowCount++;
          return res;
        }

        // 添加一条队列
        enqueue(data) {
          this.#items[this.#count] = data;
          this.#count++;
        }

        // 取队列的头部
        front() {
          return this.#items[this.#lowCount];
        }
        isEmpty() {
          return this.size() === 0;
        }
        size() {
          return this.#count - this.#lowCount;
        }
        clear() {
          this.#count = 0;
          this.#items = {};
        }
        toString() {
          let str = "";
          for (let i = this.#lowCount; i < this.#count; i++) {
            str += `${this.#items[i]}`;
          }
          return str;
        }
      }

      let queue = new Queue();

      /* 
      击鼓传花的算法题
      选到谁 谁要出列 不参与下次计算 所以要队列来实现
      
      */

      const game = (list, num) => {
        // 先生成一个队列
        let queue = new Queue();
        // 把所有人添加到队列里
        for (let i = 0; i < list.length; i++) {
          queue.enqueue(list[i]);
        }
        // 第二次循环
        while (queue.size() > 1) {
          // 如果里面的人次大于1 说明游戏还在继续
          for (let i = 0; i < num; i++) {
            // 得到出局的人  调用dequeue方法 并追加到队尾
            queue.enqueue(queue.dequeue());
          }
          console.log("out的人", queue.dequeue());
        }
        console.log("最后获胜的人", queue.dequeue());
      };

      const list = ["a", "b", "c", "d", "e"];

      game(list, 7);
    </script>
  </body>
</html>
